package com.demo.jzoffer2;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author gy
 * @date 2023/01/12
 */
public class Test0207_01 {

    /**
     * 输入一个正整数 target ，输出所有和为 target 的连续正整数序列（至少含有两个数）。
     *
     * 序列内的数字由小到大排列，不同序列按照首个数字从小到大排列。
     * @param target
     * @return
     */
    public int[][] findContinuousSequence(int target) {
        List<int[]> vec = new ArrayList<>();
        // 由于最少要有两个正数序列，上限值为 (target - 1) / 2
        // 比如 target = 21  上限值为 10
        int sum = 0,limit = (target - 1) / 2;
        // 注意：此处是 <= 包含上限值
        for (int i = 1; i <= limit; i++) {
            for (int j = i; ; j++) {
                sum += j;
                if (sum > target){
                    sum = 0; // 重置总和
                    break;
                }
                if (sum == target){
                    int[] res = new int[j - i + 1]; // j - i + 1 表示数组的大小
                    for (int k = i; k <= j ; k++) {
                        res[k - i] = k; // 初始值为 i,遍历到j, k代表从 [i,j]; k - i 表示数组的下标
                    }
                    vec.add(res);
                    sum = 0; // 重置总和，进入下次循环
                    break;
                }
            }
        }
        return vec.toArray(new int[vec.size()][]);
    }

    @Test
    public void m1() {
        System.out.println(Arrays.deepToString(this.findContinuousSequence(21)));
    }

    @Test
    public void m2() {

    }

}
